/*This file is part of StarNoid.

StarNoid is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

StarNoid is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with StarNoid.  If not, see <http://www.gnu.org/licenses/>.*/

#ifndef _ELEMENTO_
#define _ELEMENTO_
#include "constantes.h"
#include <algorithm>
using namespace std;

//Clase Elemento
struct Elemento{
	//Posicion, ancho y alto del elemento
	double arriba, izquierda, ancho, alto;
	
	//Métodos para calcular la posición derecha y abajo del elemento
	double abajo(){return arriba + alto;}
	double derecha(){return izquierda + ancho;}
	
	//Método para saber si un elemento ha colisionado con otro
	bool colisiona(Elemento& e){
		if(e.izquierda > derecha() or e.derecha() < izquierda)
			return false;
		if(e.arriba > abajo() or e.abajo() < arriba)
			return false;
		return true;
	}
};

//Clase Bloque
struct Bloque: Elemento{
	//Constructor
	Bloque(){ancho = alto = TAM_BLOQUE;}
	//Atriburo para saber si el bloque está destruido "false" o no lo está "true"
	bool EstadoBloque;
	
	//Método para detectar cual es el lado más cercano de un bloque en el que se ha producido la colisión
	int QueLado(Elemento& e){
		if(colisiona(e)){
			int arri, abaj, dere, izq;
			arri = abaj = dere = izq = 0;
			if(e.arriba < arriba and arriba < e.abajo() and e.abajo() < abajo())
				arri = arriba - e.arriba;
			if(arriba < e.arriba and e.arriba < abajo() and abajo() < e.abajo())
				abaj = e.abajo() - abajo();
			if(izquierda < e.izquierda and e.izquierda < derecha() and derecha() < e.derecha())
				dere = e.derecha() - derecha();
			if(e.izquierda < izquierda and izquierda < e.derecha() and e.derecha() < derecha())
				izq = izquierda - e.izquierda;
				
			int vertical = max(arri, abaj);
			int horizontal = max(izq, dere);
			return 1 + (int)(horizontal>vertical);
		}
		return 0;
	}
};
#endif

